package com.h819.core.collection;

import org.apache.log4j.Logger;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * @ClassName: CollectionsUtilsSample
 * @Description: TODO(集合工具类)
 * @author h819
 * @date June 10, 2009 16:15:24 PM
 * @version V0.1
 */

public class CollectionsUtilsSample {

	private static Logger log = Logger.getLogger(CollectionsUtilsSample.class);

	/**
	 * 集合本身比较操作，可以参考此例子。由于无法确定比较条件，故每个比较都要重新编写这个方法. 主要思想：把不满足条件的记录置为 null
	 * 
	 * @param srcList
	 *            待比较的集合
	 * @return 满足要求的集合
	 */

	// ArrayList: 添加、删除耗时
	// LinkedList: 查找某个元素耗时
	// 暂时还没有想好，下面这个比较函数是否应该区分
	public static ArrayList<String> doCompare(ArrayList<String> srcList) {

		// 存放满足条件的记录
		ArrayList<String> resultList = new ArrayList<String>();

		int size = srcList.size();
		// 集合相互比较，不满足条件的原始设置为 null，注意循环条件，要防止访问 null
		for (int i = 0; i < size; i++) {// 外循环
			String stri = srcList.get(i);
			if (stri == null)
				continue;
			for (int j = i + 1; j < size; j++) {// 内循环
				String strj = srcList.get(j);
				if (strj == null)
					continue;

				// 下面可以添加更加复杂的逻辑
				if (stri == strj) {
					// 去掉重复的元素
					srcList.set(i, null);
					srcList.set(j, null);
					// 保留其中之一
					// srcList.set(j, null);

				} else
					continue;
			}
		}

		// 组装数据
		for (String r : srcList)
			if (r != null)
				resultList.add(r);

		return resultList;
	}

	// list 的删除元素，要在 Iterator 上进行，不能在集合上面直接 remove ，否则再次循环的时候集合已经发上变化，会发生异常
	public List<String> doRemove(List<String> srcList, String[] str) {

		List<String> resultList = new LinkedList<String>();

		// 下面是错误的写法
		// int size = srcList.size();
		// for (int i = 0; i < size; i++) {
		// for (String s : str)
		// if (srcList.get(i).equals(s)) {
		// srcList.remove(i);
		// continue;
		// }
		// }
		// return srcList;

		// 正确的写法
		for (Iterator<String> it = srcList.iterator(); it.hasNext();) {
			String strElement = it.next();
			for (String s : str)
				if (strElement.equals(s)) {
					it.remove();
					continue;
				} else
					resultList.add(strElement);
		}
		return resultList;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		CollectionsUtilsSample cu = new CollectionsUtilsSample();

		ArrayList<ArrayList<String>> in = new ArrayList<ArrayList<String>>();
		ArrayList<ArrayList<String>> out = new ArrayList<ArrayList<String>>();

		ArrayList<String> a = new ArrayList<String>();
		a.add("a");
		a.add("2008-10-25 10:17:08");
		a.add("a1");
		a.add("a4");

		ArrayList<String> b = new ArrayList<String>();
		b.add("a");
		b.add("2008-10-25 10:29:08");
		b.add("b1");
		b.add("b4");

		ArrayList<String> c = new ArrayList<String>();
		c.add("a");
		c.add("2008-10-25 10:16:08");
		c.add("c1");
		c.add("c4");

		ArrayList<String> d = new ArrayList<String>();
		d.add("a");
		d.add("2008-10-25 10:39:08");
		d.add("c1");
		d.add("c4");

		ArrayList<String> e = new ArrayList<String>();
		e.add("e");
		e.add("2008-10-26 10:15:08");
		e.add("c1");
		e.add("c4");

		in.add(a);
		in.add(b);

		out.add(d);
		out.add(e);
		out.add(c);

		// for (ArrayList list : all)
		// System.out.println(list);

		// for (ArrayList list : cu.doCompare(all))
		// System.out.println(list);

		// cu.getIdSetFromRecord(all);

		// cu.getSpecialDayRecord(all, "2008-10-25");
		// cu.getRecordFinal(in, out, "2008-10-25");

	}
}